package fr.lna.chess.ui;


import java.awt.event.ActionEvent;

import javax.annotation.PostConstruct;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;

import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import fr.lna.chess.type.IMAGE;
import fr.lna.chess.type.ImageManager;
import fr.lna.chess.ui.type.ChessUI;
import fr.lna.chess.util.Message;
import fr.lna.util.MessageTools;

/**
 * Classe mère pour les actions
 * @author bull
 *
 */
public abstract class ChessAction extends AbstractAction implements ApplicationContextAware {

	protected Logger log = Logger.getLogger(getClass());
	protected String name;
	

	@Autowired
	@Qualifier("image.source")
	protected ImageManager imageSource;
	
	@Autowired
	@Qualifier("message.source")
	protected Message messageSource;
	private ApplicationContext applicationContext;
	
	/**
	 * Constructeur par défaut
	 * @param name 
	 */
	public ChessAction(String name) {
		super(name);   
		this.name = name;
	}
	
	/**
	 * Pour ne pas passer des arguments en paramètres du constructeur
	 */
	@PostConstruct	
	public void init() {		
	    putValue(Action.NAME, messageSource.getMessage("menu."+name));
	    putValue(Action.SHORT_DESCRIPTION, messageSource.getMessage(name + ".description"));
	    char c = messageSource.getFirstChar(name + ".mnemonic");
		putValue(Action.MNEMONIC_KEY, Integer.valueOf(c));
	    putValue(Action.SMALL_ICON, imageSource.getImageIcon(getIconSmall()));
	    putValue(Action.LARGE_ICON_KEY, imageSource.getImageIcon(getIconLarge()));	
	}

	/**
	 * Fournit le nom de l'image de petite taille (16)
	 * @return
	 */
	protected abstract IMAGE getIconSmall();


	/**
	 * Fournit le nom de l'image de grande taille.
	 * Par defaut c'est celle de petite taille.
	 * @return
	 */
	protected IMAGE getIconLarge() {
		return getIconSmall();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		log.trace(e+"()->execution de la classe ");
		traitement(e);
	}

	/**
	 * Traitement à réaliser
	 * @param e
	 */
	protected abstract void traitement(ActionEvent e);
	
	/**
	 * Renvoi la fenêtre principale
	 * @return
	 */
	protected JFrame getMainFrame() {
		ChessUI ihm = applicationContext.getBean("main.ui",ChessUI.class);   
		return ihm.getMainFrame();
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;		
	}
}
